home *** CD-ROM | disk | FTP | other *** search
/ The Atari Compendium / The Atari Compendium (Toad Computers) (1994).iso / files / prgtools / gnustuff / tos / updates / update21.zoo / libg++ / iostest / putbkdog.cc < prev    next >
Encoding:
C/C++ Source or Header  |  1992-06-03  |  1.9 KB  |  74 lines

  1. // Test streambuf::sputbackc
  2.  
  3. #include <iostream.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6.  
  7. // Read either "dog", "hound", or "hounddog".
  8. // If "dog" is found, return 1.
  9. // If "hound" is found, return 2.
  10. // If "hounddog" is found, return 3.
  11. // If non of these are found, return -1.
  12.  
  13. int unget_string(streambuf *sb, char *str, int count)
  14. {
  15.     for (str += count; -- count >= 0; )
  16.     sb->sputbackc(*--str);
  17. }
  18.  
  19. int my_scan(streambuf* sb)
  20. {
  21.     char buffer[20];
  22.     // Try reading "hounddog":
  23.     int count;
  24.     count = sb->sgetn(buffer, 8);
  25.     if (count == 8 && strncmp(buffer, "hounddog", 8) == 0)
  26.       return 3;
  27.     // No, no "hounddog":  Backup to 'fence' ...
  28.     unget_string(sb, buffer, count);
  29.     // ... and try reading "dog":
  30.     count = sb->sgetn(buffer, 3);
  31.     if (count == 3 && strncmp(buffer, "dog", 3) == 0)
  32.       return 1;
  33.     // No, no "dog" either:  Backup to 'fence' ...
  34.     unget_string(sb, buffer, count);
  35.     // ... and try reading "hound":
  36.     count = sb->sgetn(buffer, 5);
  37.     if (count == 5 && strncmp(buffer, "hound", 5) == 0)
  38.       return 2;
  39.     // No, no "hound" either:  Backup to 'fence' and signal failure.
  40.     unget_string(sb, buffer, count);
  41.     return -1;
  42. }
  43.  
  44. int main(int argc, char **argv)
  45. {
  46.     streambuf *sb = cin.rdbuf();
  47.     if (argc > 1 && strncmp(argv[1], "-b", 2) == 0) {
  48.     streambuf *ret;
  49.     int buffer_size = atoi(&argv[1][2]);
  50.     if (buffer_size == 0)
  51.         ret = sb->setbuf(NULL, 0);
  52.     else
  53.         ret = sb->setbuf(new char[buffer_size], buffer_size);
  54.     if (ret != sb)
  55.         cerr << "Warning: cin.rdbuf()->setbuf failed!\n";
  56.     }
  57.     for (;;) {
  58.     int code = my_scan(sb);
  59.     int ch = sb->sbumpc();
  60.     if (code == -1 && ch == EOF)
  61.         break;
  62.     int n = 0;
  63.     while (ch != EOF && ch != '\n') {
  64.         n++;
  65.         ch = sb->sbumpc();
  66.     };
  67.     if (ch == EOF) {
  68.         cout << "[Unexpected EOF]\n";
  69.         break;
  70.     }
  71.     cout << "Code: " << code << " followed by " << n << " chars\n";
  72.     }
  73. }
  74.